#ifndef GRAHAM
#define GRAHAM

#include "stdio.h"
#include "../../lib/algo/Travail.h"
#include "../../lib/algo/Affectation.h"
#include <vector>
#include <map>
#include <string>
#include <sstream>
#include <iostream>
#include <time.h>

using namespace std;

class Graham {
	
	vector<Travail> travails;
	typedef map<string, float> Exec;
	typedef multimap<float, float> FFMMap;
	vector<Affectation> vAffectation;

	float sysDate;
	float cMax;
	Travail travail;
	float minBis;	

	public:
		// fonction principale pour cet algo
		void applyGraham(vector<Travail> travails); 
		// fonction qui cherche le minimum
		float findMin(Exec mExec, float & minBis); 
		float findMinBis(Exec mExec, float & minBis, float min);
		// fonc. retourne la liste des machines sur les quelles on pourra exec. nos TX. @arg MMAP, nbrMachine que Travail a besoin
		vector<string> listeMachineLibre(FFMMap nbrMLibre, Exec mExec, float nbrMachine); 
		// fonc. faisant l'execution des travaux
		map<string, float> faireExecuter(Exec mExec, vector<string> lML, Travail travail, vector<Affectation> & vv); 
		// fonc. retourne la liste des machines qui se libere apres les machines finissant le plus tot
		vector<string> encoreMachineLibre(Exec & mExec, vector<string> lML, float tempsMin, int encore); 
		// fonc. qui va ajouster le temps de fin pour demarer le neveau travail
		void ajousterTemps(Exec & mExec, vector<string> lML); 
		// fonc. qui va compter le nombre des travaux qui finisse en meme temps 
		float compter(Exec mExec, float min); 
		string RecupererHeure();
		string timeToDate(float time);

};

#endif
